package com.cqfae.deploycentral.app.services.impl;

import com.cqfae.deploycentral.api.utils.IdGenerator;
import com.cqfae.deploycentral.app.config.FileSyncInfo;
import com.cqfae.deploycentral.app.dao.entity.FileSyncUpdate;
import com.cqfae.deploycentral.app.dao.mapper.FileSyncUpdateMapper;
import com.cqfae.deploycentral.app.services.FileSyncUpdateService;
import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import tk.mybatis.mapper.entity.Example;

import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.List;

/**
 * Created by JIANGLU009 on 2017/11/16.
 */
@Service
@Transactional
public class FileSyncUpdateServiceImpl implements FileSyncUpdateService {

    private static Logger logger = LoggerFactory.getLogger(FileSyncUpdateServiceImpl.class);

    @Autowired
    private FileSyncUpdateMapper fileSyncUpdateMapper;


    @Autowired
    private IdGenerator idGenerator;

    @Autowired
    private FileSyncInfo fileSyncInfo;

    /**
     * 新增
     *
     * @param fileSyncUpdate
     * @return
     */
    public Integer add(FileSyncUpdate fileSyncUpdate) {
        Integer num = 0;
        if (fileSyncUpdate != null) {
            // 源文件路径
            String fileFromPath = fileSyncInfo.getUploadRootPath()
                    + File.separator + fileSyncUpdate.getAreaCode()
                    + File.separator + fileSyncUpdate.getInteriorAreaCode()
                    + File.separator + fileSyncUpdate.getName();
            // 本地上传备份
            fileSyncUpdate.setId(idGenerator.nextId());
            // 设置更新操作者和时间
            fileSyncUpdate.setUpdateBy("123");
            fileSyncUpdate.setUpdateTime(new Date());
            // 设置新增操作者和时间
            fileSyncUpdate.setCreateBy("123");
            fileSyncUpdate.setCreateTime(new Date());
            // 文件复制到备份地址
            String originalFilename = fileSyncUpdate.getName();
            originalFilename = originalFilename.substring(0, originalFilename.lastIndexOf('.'))
                    + '-' + new Date().getTime()
                    + '.' + originalFilename.substring(originalFilename.lastIndexOf('.')
                    + 1, originalFilename.length());
            fileSyncUpdate.setName(originalFilename);
            // 新增
            num = fileSyncUpdateMapper.insert(fileSyncUpdate);
            // 复制
            fileCopy(fileFromPath, fileSyncUpdate);
        }
        return num;
    }

    /**
     * 编辑
     *
     * @param fileSyncUpdate
     * @return
     */
    public Integer edit(FileSyncUpdate fileSyncUpdate) {
        Integer num = 0;
        // 查询
        Example example = new Example(FileSyncUpdate.class);
        example.createCriteria().andEqualTo("fileSyncId", fileSyncUpdate.getFileSyncId());
        List<FileSyncUpdate> fileSyncUpdateList = fileSyncUpdateMapper.selectByExample(example);
        if (fileSyncUpdateList != null && !fileSyncUpdateList.isEmpty()) {
            FileSyncUpdate fileSyncUpdateOld = fileSyncUpdateList.get(0);
            // 将文件复制到新路径
            String fileFromPath = fileSyncInfo.getUploadBackRootPath()
                    + File.separator + fileSyncUpdateOld.getAreaCode()
                    + File.separator + fileSyncUpdateOld.getInteriorAreaCode()
                    + File.separator + fileSyncUpdateOld.getName();
            fileSyncUpdate.setName(fileSyncUpdateOld.getName());
            fileSyncUpdate.setId(fileSyncUpdateOld.getId());
            // 设置更新操作者和时间
            fileSyncUpdate.setUpdateBy("123");
            fileSyncUpdate.setUpdateTime(new Date());
            // 更新备份信息
            num = fileSyncUpdateMapper.updateByPrimaryKeySelective(fileSyncUpdate);

            fileCopy(fileFromPath, fileSyncUpdate);
            // 删除源文件
            File fileFrom = new File(fileFromPath);
            if ((!fileSyncUpdateOld.getAreaCode().equals(fileSyncUpdate.getAreaCode())
                    || !fileSyncUpdateOld.getInteriorAreaCode().equals(fileSyncUpdate.getInteriorAreaCode())) && fileFrom.exists()) {
                boolean result = fileFrom.delete();
                logger.info("删除备份源文件结果：{}", result ? "成功" : "失败");
            }
        }

        return num;
    }

    /**
     * 文件复制
     *
     * @param fileSyncUpdate
     */
    private void fileCopy(String fileFromPath, FileSyncUpdate fileSyncUpdate) {
        String fileToPath = fileSyncInfo.getUploadBackRootPath()
                + File.separator + fileSyncUpdate.getAreaCode()
                + File.separator + fileSyncUpdate.getInteriorAreaCode()
                + File.separator + fileSyncUpdate.getName();
        File fileFrom = new File(fileFromPath);
        File fileTo = new File(fileToPath);
        logger.info("备份文件复制：\n源地址：{}\n目标地址{}", fileFromPath, fileToPath);
        // 源地址和目标地址相同时不作操作
        if (fileFromPath.equals(fileToPath)) {
            logger.info("备份文件地址相同，不移动");
            return;
        }
        if (!fileFrom.exists()) {
            Assert.isTrue(false, "复制文件不存在");
        }
        try {
            FileUtils.copyFile(fileFrom, fileTo);
            logger.info("备份文件成功");
        } catch (IOException e) {
            logger.error("FileSyncUpdateServiceImpl fileCopy IOException : {}", e);
        }
    }
}
